// node的内置核心模块：http
// 每次改动文件都要重启文件，nodemon 1.http.js 监控node文件改动，自动重启

const http = require('http');
const url = require('url');

/**
 *  uri（uniform resource indentifier）：统一资源，包含url
 *  url（）：
 */
// console.log(url.parse('http://username.password.baidu.com:8000/user?a=12#123', true));
/**
 * url.parse(url, [true]):格式化url
 * hostname： 主机名 username.password.baidu.com
 * query：参数  {a: 12}
 * pathname： 路径 / user
 */
const server = http.createServer(function (req, res) {
  // console.log(req.method); // 默认大写的
  // console.log(req.url); //  /后面 #前面的
  // let {
  //   query,
  //   pathname
  // } = url.parse(req.url, true);
  // console.log(query, pathname);
  // 获取地址栏？后面的参数，可以使用url模块，或者正则匹配
  // console.log(req.httpVersion); //
  // console.log(req.headers); // 浏览器所有的头，所有的key都是小写的

  // req是一个可读流
  // 接收post请求数据
  // let arr = [] // 前端传递的数据有可能是二进制，所以用buffer接收比较合理
  // 如果传递的数据是空，就是流中没有数据，那内部也会调push(null)，只要调用了push方法，就一定会触发end事件

  /* req.on('data', function (chunk) {
    arr.push(chunk)
  }) */
  // 即便是get请求也触发end方法
  /* req.on('end', function () {
    console.log(Buffer.concat(arr).toString());
  }); */

  // curl -v -X POST -d a=1 http://localhost:3000
  /**
   * curl -v 显示详细信息
   * curl -X 指定方法 POST GET（默认）
   * curl -d 携带参数 a=12
   * curl -h 携带header头信息 
   */

  //=============== 响应给客户端的信息
  /**
   * 响应行和响应头和响应体 顺序不能发生变化
   * res是一个可写流只有两个方法：write和end
   */

  res.statusCode = 200; // 状态码
  res.statusMessage = 'ok';
  res.setHeader('a', '1');
  res.write('ok'); // 分段响应 会有这个字段 Transfer-Encoding: chunked
  res.end(); // 写入结束了

});
// 等价上面的写法
/* server.on('request', function (req, res) {
  console.log('2');
}); */
let port = 3000; // 一般用3000以上的
server.listen(port, function () {
  console.log('server start ' + port);
});
// 监听错误，当端口好呗占用了的时候，从新起一个端口监听
server.on('error', function (err) {
  // console.dir(err);
  if (err.errno === 'EADDRINUSE') {
    server.listen(++port); // 端口占用了，累加端口好重启
  }
});